/**************基于51单片机的数字音乐盒***********/

#include <REGX52.H>		
#include "Tim.h"		//定时器的头文件
#include "Delay.h"		//延时函数
#include "LCD1602.h"	//LCD1602液晶屏头文件
#include "Music.h"
#include "Key.h"


/******变量-标志位******/
unsigned char Music_Mode = 0;			//模式--- 0 暂停(停止)，123分别代表第123首歌曲
unsigned char Music_Mode_Select = 0;		//模式选择按键
unsigned char FreqSelect,MusicSelect;
unsigned char key2_flag;

unsigned int uwtick, key_tick;
unsigned char key_num = 0;

/*******函数声明*******/

static void Key_proc(void);					//按键扫描函数
static void Select_MusicMode_Function(void);	//选择音乐模式函数


void main()
{
	Timer0_Init();	//初始化默认停止计时，TR0 = 0;
    Timer1_Init();
    
	LCD_Init();		
	//开机动画
	LCD_ShowString(1,1,"Welcome");	//第一行第一列显示ABC
	LCD_ShowString(2,1,"Music OFF");	//开机默认显示 Music OFF
	while(1)
	{
        key_num = Key();
		Key_proc();
//		Select_MusicMode_Function();
	}
}



/*******定时器0的中断服务子函数*******/
void Timer0_Routine() interrupt 1  
{
	//1ms进一次，2ms一周期，频率f=500Hz
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;//翻转蜂鸣器IO口
	}

}

/*******定时器1的中断服务子函数*******/
void Timer1_Routine() interrupt 3
{
	static unsigned int T1Count;
	TL1 = 0x18;			//设置定时初始值

    if (++uwtick >= 60000)
        uwtick = 0;
    
	if(++T1Count >= 10)
	{
        Key_Loop(); //按键扫描
		T1Count=0;
        
	}
}

/**********************函数部分**********************/


static void Key_proc(void)	//按键扫描函数
{
//    if (uwtick - key_tick < 100)
//		return;
//	key_tick = uwtick;

	if (1 == key_num && key2_flag == 0)  //按键1按下 && 音乐暂停
    {
        Music_Mode_Select++;
        if (Music_Mode_Select >=4)
            Music_Mode_Select = 1;
        MusicSelect = 0;
        
        if (Music_Mode_Select == 1)
            LCD_ShowString(2,1,"Music 1     ");
        else if (Music_Mode_Select == 2)
            LCD_ShowString(2,1,"Music 2     ");
        else if (Music_Mode_Select == 3)
            LCD_ShowString(2,1,"Music 3     ");
    }

	if (2 == key_num)	//按键2开始播放所选择的乐曲
	{
        key2_flag = ! key2_flag;
        if(key2_flag == 0)  //默认暂停
        {
            Music_Mode = 0;
            TR0 = 0;	//暂停计时
        }
        else
        {
            Music_Mode = Music_Mode_Select;	//将当前选择的模式赋值给Music_Mode变量
            TR0 = 1;	//音乐开启
        }
	}
}

static void Select_MusicMode_Function(void)
{
	if (0 == Music_Mode)
	{
		TR0 = 0;	//暂停计时
	}		
	if (1 == Music_Mode)	//模式1 --- 歌曲1 --- 《花海》
	{
		LCD_ShowString(2,1,"Music 1 play ");
		if(Music_HuaHai[MusicSelect]!=0xFF)//如果不是停止标志位
		{
			FreqSelect = Music_HuaHai[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_HuaHai[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;		//清零Music_Mode变量，改变成模式0，代表暂停（停止）
            LCD_ShowString(2,1,"Music 1 stop");
//				TR0=0;
//				while(1);//播放完死循环
		}
	}
		
	if (2 == Music_Mode)	//模式2 --- 歌曲2 --- 《天空之城》
	{
		LCD_ShowString(2,1,"Music 2 play ");
		if(Music_Castle_in_the_Sky[MusicSelect]!=0xFF)//如果不是停止标志位
		{
			FreqSelect = Music_Castle_in_the_Sky[MusicSelect];//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_Castle_in_the_Sky[MusicSelect]);//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
            LCD_ShowString(2,1,"Music 2 stop");
		}
	}
		
	if (3 == Music_Mode)	//模式3 --- 歌曲3 --- 《勇气大爆发》
	{
		LCD_ShowString(2,1,"Music 3 play ");
		if(Music_3[MusicSelect]!=0xFF)				//如果不是停止标志位
		{
			FreqSelect = Music_3[MusicSelect];		//选择音符对应的频率
			MusicSelect++;
			Delay((SPEED/4)*Music_3[MusicSelect]);	//十六分音符是125ms，选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			Music_Mode = 0;
            LCD_ShowString(2,1,"Music 3 stop");
		}
	}
}
